package com.atguigu.gmall.pms.service.impl;

import com.atguigu.gmall.common.consts.GmallConsts;
import com.atguigu.gmall.pms.config.RabbitmqConfig;
import com.atguigu.gmall.pms.entity.SkuAttrValueEntity;
import com.atguigu.gmall.pms.entity.SkuImagesEntity;
import com.atguigu.gmall.pms.entity.vo.SkuVO;
import com.atguigu.gmall.pms.entity.vo.SpuVO;
import com.atguigu.gmall.pms.feign.GmallSmsClient;
import com.atguigu.gmall.pms.service.SkuAttrValueService;
import com.atguigu.gmall.pms.service.SkuImagesService;
import com.atguigu.gmall.sms.api.GmallSmsApi;
import com.atguigu.gmall.sms.vo.SkuSaleVO;
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.atguigu.gmall.common.bean.PageResultVo;
import com.atguigu.gmall.common.bean.PageParamVo;

import com.atguigu.gmall.pms.mapper.SkuMapper;
import com.atguigu.gmall.pms.entity.SkuEntity;
import com.atguigu.gmall.pms.service.SkuService;
import org.springframework.util.CollectionUtils;

import javax.annotation.Resource;


@Service("skuService")
public class SkuServiceImpl extends ServiceImpl<SkuMapper, SkuEntity> implements SkuService {
    @Resource
    SkuImagesService skuImagesService;
    @Resource
    SkuAttrValueService skuAttrValueService;
    @Resource
    GmallSmsClient gmallSmsClient;
    @Resource
    RabbitTemplate rabbitTemplate;
    @Override
    public PageResultVo queryPage(PageParamVo paramVo) {
        IPage<SkuEntity> page = this.page(
                paramVo.getPage(),
                new QueryWrapper<SkuEntity>()
        );

        return new PageResultVo(page);
    }
    public void saveSkus(SpuVO spuVO, Long spuId) {
        List<SkuVO> skuVOS = spuVO.getSkus();
        if(CollectionUtils.isEmpty(skuVOS)){
            return;
        }
        skuVOS.forEach(skuVO -> {
            List<String> skuVOImages = skuVO.getImages();
            //4.1 保存sku
            //前端提交的一个sku数据 缺少：spuid,categoryId,brandId,defaultImage
            skuVO.setSpuId(spuId);
            skuVO.setCategoryId(spuVO.getCategoryId());
            skuVO.setBrandId(spuVO.getBrandId());
            skuVO.setDefaultImage(CollectionUtils.isEmpty(skuVOImages)?null:skuVOImages.get(0));
            this.save(skuVO);
            //保存之后获取sku的id
            Long skuId = skuVO.getId();
            //4.2、保存sku的图片:
            if(!CollectionUtils.isEmpty(skuVOImages)){
                List<SkuImagesEntity> skuImagesEntities = skuVOImages.stream().map(skuVOImage -> {
                    SkuImagesEntity skuImagesEntity = new SkuImagesEntity();
                    skuImagesEntity.setUrl(skuVOImage);
                    skuImagesEntity.setSkuId(skuId);
                    skuImagesEntity.setSort(0);
                    skuImagesEntity.setDefaultStatus(skuVO.getDefaultImage().equals(skuVOImage)?1:0);
                    return skuImagesEntity;
                }).collect(Collectors.toList());
                skuImagesService.saveBatch(skuImagesEntities);
            }
            //4.3、保存sku 销售属性和值
            List<SkuAttrValueEntity> saleAttrs = skuVO.getSaleAttrs();
            if(!CollectionUtils.isEmpty(saleAttrs)){
                saleAttrs.forEach(saleAttr->{
                    saleAttr.setSkuId(skuId);
                    saleAttr.setSort(0);
                });
                skuAttrValueService.saveBatch(saleAttrs);
            }
            //4.4、保存sku 营销数据： sms服务  服务远程访问
            //  折扣  满减  积分
            /*
                 1、服务远程访问：
                        同步请求
                 2、mq消息队列：
                        异步请求
             */
            SkuSaleVO skuSaleVO = new SkuSaleVO();
            BeanUtils.copyProperties(skuVO,skuSaleVO);
            skuSaleVO.setSkuId(skuId);
            //如果远程访问采用了熔断降级处理，访问失败时是否有异常？
            //此处出现异常时 我们希望异常抛出 让事务回滚
            gmallSmsClient.saveSkuSales(skuSaleVO);
        });
    }


    @Override
    public void deleteByIds(List<Long> ids) {
        this.removeByIds(ids);
//        Map<String,Object> map = new HashMap<>();
//        map.put("type", 1);//1表示删除
//        map.put("token" , IdWorker.getIdStr());// token用来解决幂等性问题
//        map.put("param",ids); //消息的真实内容
//        //发送消息到mq消息队列
//        rabbitTemplate.convertAndSend(GmallConsts.SEARCH_EXCHANG,
//                GmallConsts.SEARCH_DEL_ROUTING_KEY , map);
        RabbitmqConfig.rabbitmqConfig.sendSearchMsg(ids , 1);
    }

}